#include<stdio.h>
#include<stdlib.h>
#include<string.h> 
#include"book.h"
#include"file.h"


Gnode *create_doublelist()
{
	Gnode*p = (Gnode *)malloc(sizeof(*p));
    p->first = NULL;	//	指向单链表的第一个结点(空链表)
    p->last = NULL;     //指向最后一个结点
    p->booknum = 0;		//	链表的结点数
    return p;
}


void add_book(Gnode  *l,int bookid, char *bookname,char *writer,int num)//增加图书
{
	if(l)	
	{
		//	1、给新元素分配动态 结点空间
		Node *newp = malloc(sizeof(Node));
		newp->bookid = bookid;
        strncpy(newp->bookname,bookname,sizeof(newp->bookname)-1);
         newp->bookname[sizeof(newp->bookname) - 1] = '\0';
        strncpy(newp->writer,writer,sizeof(newp->writer)-1);
        newp->writer[sizeof(newp->writer) - 1] = '\0';

        newp->num = num;
		newp->next = NULL;				

		//	2、无中生有
		if(l->booknum== 0)			
		{
			l->first =  l->last= newp;
		}
		
		//	3、有元素继续插入
		else
		{
            Node *p = l->first;			//	找到待删元素
    
		    while(p != NULL)			//	元素存在
		    {
			    if(p->bookid == bookid)
			    {
				    p->num++;
                    return;
			    }
			    p = p->next;			//	下一个元素 
		    }
             if(p==NULL)
			{   l->last->next = newp;		
				l->last = newp;
            }    			
			
		}	
		l->booknum ++;	
	}
    
}


Node* find_bookid(Gnode *l,int x)//按书id查找
{
	if(l)		
	{
		Node *p = l->first;	//	保存第一个元素
		while(p != NULL)		
		{
			if(p->bookid == x)
			{
            
                return p;
			}
			p = p->next;			//	下一个元素 
		}
		 if(p==NULL)
        {

            printf("没有这本书\n");//	没找到	
            return p;
        }	
	}
}


Node* find_bookname(Gnode *l,char* name)//按书名查找
{
	if(l)		
	{
		Node *p = l->first;	//	保存第一个元素
		while(p != NULL)		
		{
			if(strcmp(p->bookname,name)==0)
			{
				
                return p;
			}
			p = p->next;			//	下一个元素 
		}
		 if(p==NULL)
        {
            printf("没有这本书\n");//	没找到	
            return p;
        }
	}
}

void find_bookwriter(Gnode *l,char* writer)//按作者查找
{
	if(l)		
	{
		Node *p = l->first;	//	保存第一个元素
		while(p != NULL)		
		{
			if(strcmp(p->writer,writer)==0)
			{
                printf("%d\t%s\t%s\t%d\n",p->bookid,p->bookname,p->writer,p->num);
			}
			p = p->next;			//	下一个元素 
		}
       

	}
}

void change_book(Node *p,int bookid, char *bookname,char *writer,int num)
{
	    p->bookid = bookid;
        strncpy(p->bookname,bookname,sizeof(p->bookname)-1);
        strncpy(p->writer,writer,sizeof(p->writer)-1);
        p->num = num;
        printf("修改成功\n");
}


void delete_book(Gnode *l,char*name)
{
	if(l)		//	链表存在才能执行!!!
	{
		//	1、先找到待删元素
		Node *p = l->first;			//	找到待删元素
        Node *pr =NULL;
		while(p != NULL)			//	元素存在
		{
			if(strcmp(p->bookname,name)==0)
			{
				break;
            } 
            pr=p;
			p = p->next;			//	下一个元素 
		}

		//	2、分情况删除待删元素
		if(p == NULL)
		{
			 printf("没有这本书\n");				//	没有找到待删元素
		}
		else						//	找到了待删元素,待删元素为 链表中唯一一个元素时,情况并入到 删头
		{
			//	删头
			if(p == l->first)		//	待删元素是 第一个元素
			{
				if(l->booknum == 1)		//	元素个数为 1
				{
					l->first = l->last = NULL;	//	空链表
				}
				else
				{
					l->first = p->next;			//	原本第二个元素变为 新的 第一个元素
				}
	 		}
			//	删尾
			else if(p->next == NULL)//	待删元素是 最后一个元素
			{
				l->last = pr;		//	原本倒数第二个元素变为 新的 最后一个元素
				l->last->next = NULL;	//	最后一个元素 没有后继	
	 		}
			//	删中间
			else
			{
				pr->next = p->next;	//	待删元素的前驱 的后继 变为 待删元素的后继
	 		}				
			p->next = NULL;			//	待删元素的断掉与后继的关系
			free(p);				//	释放 malloc 空间
			l->booknum --;
            printf("删除成功\n");
		}
	}
}






